package com.example.demo.easyexcel.controller;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.listener.PageReadListener;
import com.alibaba.fastjson.JSON;
import com.example.demo.easyexcel.db.entity.PhysicalFitnessTest;
import com.example.demo.easyexcel.db.repository.PhysicalFitnessTestRepository;
import com.example.demo.easyexcel.service.ModelService;
import com.example.demo.ykj.counts.Counts;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author: zjq
 * @Date: 2024/6/24 11:43
 */
@Api(tags = {"滨江体测数据"})
@RestController
@RequestMapping("/physicalFitnessTest")
public class PhysicalFitnessTestController {


    @Autowired
    private PhysicalFitnessTestRepository physicalFitnessTestRepository;

    @ApiOperation(value = "写入数据库")
    @PostMapping("upload")
    @ResponseBody
    public void upload1(MultipartFile file, Long xxid) throws IOException {
//        // 这里 需要指定读用哪个class去读，然后读取第一个sheet 文件流会自动关闭
//        // 这里每次会读取3000条数据 然后返回过来 直接调用使用数据就行
//        EasyExcel.read(file.getInputStream(), PhysicalFitnessTest.class, new PageReadListener<PhysicalFitnessTest>(dataList -> {
//            // 这里 需要指定读用哪个class去读，然后读取第一个sheet 文件流会自动关闭
//            for (PhysicalFitnessTest demoData : dataList) {
//                demoData.setXxid(xxid);
//                System.out.println("读取到一条数据{}" + JSON.toJSONString(demoData));
//                physicalFitnessTestRepository.save(demoData);
//            }
//        })).sheet().doRead();

            List<PhysicalFitnessTest> dataList = new ArrayList<>();
            EasyExcel.read(file.getInputStream(), PhysicalFitnessTest.class, new PageReadListener<PhysicalFitnessTest>(data -> {
                for (PhysicalFitnessTest demoData : data) {
                    demoData.setXxid(xxid);
                    dataList.add(demoData);
                }
                // 达到一定数量后进行批量保存，例如每3000条数据保存一次
                if (dataList.size() >= 3000) {
                    // 假设dataList是需要保存的所有数据
                    physicalFitnessTestRepository.saveAll(dataList);
                    // 可选：根据实际情况决定是否手动flush和clear以管理内存
                    physicalFitnessTestRepository.flush();
                    dataList.clear(); // 清空列表，准备下一批数据
                }
            })).sheet().doRead();

            // 处理剩余不足3000条的数据
            if (!dataList.isEmpty()) {
                // 假设dataList是需要保存的所有数据
                physicalFitnessTestRepository.saveAll(dataList);
                // 可选：根据实际情况决定是否手动flush和clear以管理内存
                physicalFitnessTestRepository.flush();
            }
    }

}
